"""
Case Type   : 系统内部使用工具
Case Name   : gs_ctl build使用-D指定正确数据库实例目录重建备机是否可以成功
Create At   : 2021/01/18
Owner       : opentestcase015
Description :
    1.gs_ctl指定-D设置为正确的数据库实例目录，重建备机
    2.查看集群状态与备机是否重建成功
    3.环境恢复
Expect      :
    1.gs_ctl指定-D设置为正确的数据库实例目录，重建备机成功
    2.集群状态正常，备机状态为Normal，备机重建成功
    3.成功
History     :
    Modified by lopentestcase027 2023/1/11: 优化用例步骤格式及一主两备判断方式
    Modified by opentestcase042 2023/3/30: 优化用例,增加等待时间后判断备机状态
"""

import unittest
import os
import time
from testcase.utils.CommonSH import CommonSH
from testcase.utils.Constant import Constant
from testcase.utils.Logger import Logger
from yat.test import Node
from yat.test import macro

LOG = Logger()
primary_sh = CommonSH('PrimaryDbUser')


@unittest.skipIf(3 != primary_sh.get_node_num(), '非1+2环境不执行')
class LogicalReplication(unittest.TestCase):
    def setUp(self):
        LOG.info(f'--------{os.path.basename(__file__)} start--------')
        self.constant = Constant()
        self.PrimaryNode = Node('PrimaryDbUser')
        self.user_node = Node('Standby1DbUser')
        self.sh_standby = CommonSH('Standby1DbUser')

    def test_system_internal_tools(self):
        LOG.info('--------step1:备机重建   expect:成功------')
        excute_cmd = f"source {macro.DB_ENV_PATH};" \
                     f"gs_ctl build -D {macro.DB_INSTANCE_PATH}"
        LOG.info(excute_cmd)
        msg = self.user_node.sh(excute_cmd).result()
        LOG.info(msg)
        self.assertIn(self.constant.BUILD_SUCCESS_MSG, msg)

        LOG.info('------step2:查看集群、备机状态  expect:集群、备机状态正常------')
        time.sleep(3)
        status = self.sh_standby.get_db_cluster_status(param='detail')
        LOG.info(status)
        self.assertTrue(len(status.splitlines()) >= 10)
        self.assertIn('Standby Normal', status.splitlines()[-2])
        self.assertTrue(self.constant.CLUSTER_NORMAL_MSG in status)

    def tearDown(self):
        LOG.info('--------step3:恢复环境    expect:成功--------')
        restart = self.sh_standby.restart_db_cluster()
        LOG.info(restart)
        self.assertTrue(restart)
        status = self.sh_standby.get_db_cluster_status(param='detail')
        LOG.info(status)
        self.assertTrue(self.constant.CLUSTER_NORMAL_MSG in status)
        LOG.info(f'--------{os.path.basename(__file__)} end--------')
